package com.ruoyi.project.remoteControl.utils;

import com.alibaba.fastjson.JSONObject;
import com.ruoyi.project.remoteControl.domain.SessionInfo;
import org.springframework.stereotype.Component;

/**
 * SessionInfo类的处理工具类，用于操作SessionInfo的sessionList
 */
@Component
public class SessionInfoUtils {
    /**
     * 接收到远控会话信息后，插入新会话信息/更新已有会话信息
     * @param sessionInfo 被控端生成的远控会话信息
     */
    public void insertOrReplaceSessionInfo(JSONObject sessionInfo){
        boolean exist = false;
        for (int i = 0; i < SessionInfo.sessionList.size(); i++) {
            // 判断是否已存在该对话
            if (SessionInfo.sessionList.get(i).getString("deviceClientId").equals(sessionInfo.getString("deviceClientId"))){
                exist = true;
                // 更新会话信息
                SessionInfo.sessionList.get(i).put("address",sessionInfo.getString("address"));
                SessionInfo.sessionList.get(i).put("cid",sessionInfo.getString("cid"));
                SessionInfo.sessionList.get(i).put("msg",sessionInfo.getString("msg"));
                break;
            }
        }
        // 不存在则插入新对话
        if (!exist){
            SessionInfo.sessionList.add(sessionInfo);
        }
    }

    /**
     * 主控端结束远控后，从SessionInfo.sessionList删除对应远控对话信息
     * @param deviceClientId 被控端MQTT的ClientId
     */
    public void deleteSessionInfo(String deviceClientId){
        for (int i = 0; i < SessionInfo.sessionList.size(); i++) {
            if (SessionInfo.sessionList.get(i).getString("deviceClientId").equals(deviceClientId)){
                SessionInfo.sessionList.remove(i);
                break;
            }
        }
    }

    /**
     * 根据被控端MQTT的ClientId，从SessionInfo.sessionList中读取远控会话信息
     * @param deviceClientId 被控端MQTT的ClientId
     * @return
     */
    public JSONObject getSessionInfo(String deviceClientId){
        for (int i = 0; i < SessionInfo.sessionList.size(); i++) {
            if (SessionInfo.sessionList.get(i).getString("deviceClientId").equals(deviceClientId)){
                return SessionInfo.sessionList.get(i);
            }
        }
        return null;
    }

    /**
     * 远控结束成功时，被控端返回的处理结果中包含 msg：“xxx（deviceClientId）的远控服务注销成功！”
     * 通过此函数将SessionInfo.sessionList中对应会话信息的msg更新，为程序判断远控结束是否成功提供一个判断基准
     * @param sessionInfo
     */
    public void updateMsg(JSONObject sessionInfo) {
        for (int i = 0; i < SessionInfo.sessionList.size(); i++) {
            if (SessionInfo.sessionList.get(i).getString("deviceClientId").equals(sessionInfo.getString("deviceClientId"))) {
                SessionInfo.sessionList.get(i).put("msg",sessionInfo.getString("msg"));
                break;
            }
        }
    }

    /**
     * 判断发起远控是否成功
     * @param deviceClientId
     * @return
     */
    public boolean isInstallSuccess(String deviceClientId){
        // 在SessionInfo.sessionList中能找到会话信息说明远控发起成功
        for (int i = 0; i < SessionInfo.sessionList.size(); i++) {
            if (SessionInfo.sessionList.get(i).getString("deviceClientId").equals(deviceClientId)){
                return true;
            }
        }
        return false;
    }

    /**
     * 判断结束远控是否成功
     * @param deviceClientId
     * @return
     */
    public boolean isUninstallSuccess(String deviceClientId){
        // 会话信息中的msg被更新为"远控服务注销成功！"，说明远控结束成功
        for (int i = 0; i < SessionInfo.sessionList.size(); i++) {
            if (SessionInfo.sessionList.get(i).getString("deviceClientId").equals(deviceClientId)){
                if (SessionInfo.sessionList.get(i).getString("msg").contains("远控服务注销成功！")){
                    return true;
                }
                break;
            }
        }
        return false;
    }
}
